/**********************************************************************************************
* 版    权：上海金智晟东电力科技有限公司南京分公司
* 项目名称：
* 产品名称：
* 创建日期：2022年06月16日
* 创 建 人：zzg
* 文 件 名：rtc_ex.c
* 文件功能：外部实时时钟驱动
* 修 改 者：							日期：
* 备    注：
***********************************************************************************************/
// #include "bsp.h"
// #include "os.h"
#include "myiic.h"
// #include "mytimer.h"
#include "rx8803.h"
#include "los_typedef.h"

/**********************************************************************************************
* 函 数 名：BYTE BcdConvertHex(BYTE bcd_data)
* 功能描述：BCD码转十六进制函数
* 输    入：bcd_data:待转换BCD码
* 返    回：
* 设 计 者：zzg								日期：2022年05月10日
* 修 改 者：								日期：
***********************************************************************************************/
BYTE BcdConvertHex(BYTE bcd_data)
{
	BYTE temp;
	temp = ((bcd_data >> 4) * 10) + (bcd_data & 0x0F);
	return temp;
}
/**********************************************************************************************
* 函 数 名：BYTE HexConvertBcd(BYTE hex_data)
* 功能描述：十六进制转BCD码函数
* 输    入：hex_data:待转换十六进制数
* 返    回：
* 设 计 者：zzg								日期：2022年05月10日
* 修 改 者：								日期：
***********************************************************************************************/
BYTE HexConvertBcd(BYTE hex_data)
{
	BYTE temp;
	BYTE bcd_data;
	temp = hex_data % 100;
	bcd_data = (temp / 10 << 4)|(temp % 10);
	return bcd_data;
}

/**********************************************************************************************
* 函 数 名：void RtcExWriteData(uint8_t *buf, uint8_t id, uint8_t addr, int32_t len)
* 功能描述：外部RTC写数据函数
* 输    入：buf:待传输数据指针
* 			id:设备ID
* 			addr:寄存器地址
* 			len:数据长度
* 返    回：
* 设 计 者：zzg								日期：2022年06月16日
* 修 改 者：								日期：
***********************************************************************************************/
void RtcExWriteData(uint8_t *buf, uint8_t id, uint8_t addr, int32_t len)
{
	IIC_BuffWrite(id, addr, buf, len);
}

/**********************************************************************************************
* 函 数 名：void RtcExReadData(uint8_t *buf, uint8_t id, uint8_t addr, int32_t len)
* 功能描述：外部RTC读数据函数
* 输    入：buf:待接收数据指针
* 			id:设备ID
* 			addr:寄存器地址
* 			len:数据长度
* 返    回：
* 设 计 者：zzg								日期：2022年06月16日
* 修 改 者：								日期：
***********************************************************************************************/
void RtcExReadData(uint8_t *buf, uint8_t id, uint8_t addr, int32_t len)
{
	IIC_BuffRead(id, addr, buf, len);
}

/**********************************************************************************************
* 函 数 名：void RtcExtGetTime(struct VSysClock *pTime)
* 功能描述：获取外部实时时钟函数
* 输    入：pTime：系统实时时钟结构体指针
* 返    回：
* 设 计 者：zzg								日期：2022年05月10日
* 修 改 者：								日期：
***********************************************************************************************/
void RtcExtGetTime(VSysClock *pTime)
{
	BYTE ptr1[17] = {0};
	BYTE ptr2[17] = {0};
	BYTE *ptr;
	BOOL rx8033sa = 1;
	UINT8 i=0;
	RtcExReadData(ptr1, RTC_ADDR, RTC_DATA_10MS, 8);
	RtcExReadData(ptr2, RTC_ADDR, RTC_DATA, 7);
	if(((BcdConvertHex(ptr2[0]&0x7F) - BcdConvertHex(ptr1[1]&0x7F) + 60)%59 >= 2)	||
		((BcdConvertHex(ptr2[1]&0x7F) - BcdConvertHex(ptr1[2]&0x7F) + 60)%59 >= 2)	||
		((BcdConvertHex(ptr2[5]&0x7F) - BcdConvertHex(ptr1[6]&0x7F) + 60)%59 >= 2)	||
		((BcdConvertHex(ptr2[6]&0x7F) - BcdConvertHex(ptr1[7]&0x7F) + 60)%59 >= 2))
	{
		rx8033sa = 0;
	}
	
	RtcExReadData(ptr1, RTC_ADDR, RTC_DATA + RTC_DATA_10MS*rx8033sa, 8);
	RtcExReadData(ptr2, RTC_ADDR, RTC_DATA + RTC_DATA_10MS*rx8033sa, 8);
	if((ptr1[6] == ptr2[6]) && (ptr1[5] == ptr2[5]) && (ptr1[4] == ptr2[4]) && (ptr1[3] == ptr2[3]) &&
		(ptr1[2] == ptr2[2]) && (ptr1[1 + rx8033sa*6] == ptr2[1 +rx8033sa*6]) &&
		((ptr1[0+rx8033sa] == ptr2[0+rx8033sa]) ||(ptr1[0+rx8033sa] == (ptr2[0+rx8033sa] -1))))
	{
		ptr = ptr2 + rx8033sa;
	}
	else
	{
		RtcExReadData(ptr2, RTC_ADDR, RTC_DATA + RTC_DATA_10MS*rx8033sa, 8);
		ptr = ptr2 + rx8033sa;
	}
	if(rx8033sa)
	{
		pTime->wMSecond = BcdConvertHex(ptr2[0] & 0xFF) * 10;
	}
	else
	{
		pTime->wMSecond = 0;
	}
	
	pTime->bySecond = BcdConvertHex(ptr[0] & 0x7F);
	pTime->byMinute = BcdConvertHex(ptr[1] & 0x7F);
	pTime->byHour   = BcdConvertHex(ptr[2] & 0x3F);
	
	pTime->byDay    = BcdConvertHex(ptr[4] & 0x3F);
	pTime->byMonth  = BcdConvertHex(ptr[5] & 0x1F);
	pTime->wYear    = BcdConvertHex(ptr[6]) + 2000;
}
/**********************************************************************************************
* 函 数 名：void RtcExtSetTime(VSysClock *pTime)
* 功能描述：设置外部实时时钟函数
* 输    入：pTime：系统实时时钟结构体指针
* 返    回：
* 设 计 者：zzg								日期：2022年05月10日
* 修 改 者：								日期：
***********************************************************************************************/
void RtcExtSetTime(VSysClock *pTime)
{
	BYTE ptr[10]={0};
	UINT8 i=0;
	ptr[0] = HexConvertBcd(pTime->bySecond);
	ptr[1] = HexConvertBcd(pTime->byMinute);
	ptr[2] = HexConvertBcd(pTime->byHour);
	
	ptr[4] = HexConvertBcd(pTime->byDay);
	ptr[5] = HexConvertBcd(pTime->byMonth);
	ptr[6] = HexConvertBcd(pTime->wYear-2000);
	
	RtcExWriteData(ptr, RTC_ADDR, RTC_DATA, 7);
}





